#include <lcaixa.h>

/**
 *
 */
COLUNAS_LC::COLUNAS_LC()
	{
	this->n_campos = 7;
	add(this->descricao);
	add(codigo);
	add(protocolo);
	add(receita);
	add(despesa);
	for(int i=0; i< this->n_campos; i++)
		{
		add(this->campo[i]);
		}
	}

/**
 *
 */
COLUNAS_LC::~COLUNAS_LC()
	{
			
	}

LCAIXA::LCAIXA(BANCOPG *conn)
	{
	Gtk::VBox *Box;
	Gtk::Toolbar *TB;
	Gtk::ScrolledWindow *SW;
	string aux;

	conexao = conn;
	aux.clear();
	aux.append(IMG_PATH);
	aux+="caixa.ico";
	this->ponteiro_icon=Gdk::Pixbuf::create_from_file (aux);
	total = 0;
	pagina = 0;
	paginas = 0;
	limite = 10;
	this->set_title(Glib::ustring(".:Controle Livro Diário Auxiliar:."));
	set_size_request (700,400);
	this->set_icon(this->ponteiro_icon);
	this->set_type_hint(Gdk::WINDOW_TYPE_HINT_NORMAL);
	this->set_position(Gtk::WIN_POS_CENTER);
	this->signal_hide().connect(sigc::bind<Gtk::Window *>(sigc::mem_fun(*this,&LCAIXA::sair),this));
	signal_show().connect(sigc::bind<int>(sigc::mem_fun(*this,&LCAIXA::carregar),1));
	Box = new Gtk::VBox(false,0);
	TB = new Gtk::Toolbar ();
	BT_Novo = new Gtk::ToolButton (Gtk::Stock::NEW);
	BT_Novo->set_tooltip_text (Glib::ustring("Registrar"));
	TB->append(*BT_Novo);
	BT_Editar = new Gtk::ToolButton (Gtk::Stock::EDIT);
	BT_Editar->set_tooltip_text (Glib::ustring("Editar Selecionado"));
	TB->append(*BT_Editar);
	Box->pack_start(*TB,false,false,0);
	SW = new Gtk::ScrolledWindow ();
	SW->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
	TV = new Gtk::TreeView ();
	SW->add(*TV);
	Box->pack_start(*SW,true,true,0);
	TB = new Gtk::Toolbar ();
	BT_Nav[0] = new Gtk::ToolButton (Gtk::Stock::GOTO_FIRST);
	BT_Nav[0]->set_tooltip_text (Glib::ustring("Primeiro"));
	BT_Nav[0]->signal_clicked ().connect(sigc::bind<int>(sigc::mem_fun(*this,&LCAIXA::navegar),1));
	BT_Nav[1] = new Gtk::ToolButton (Gtk::Stock::GO_BACK);
	BT_Nav[1]->set_tooltip_text (Glib::ustring("Anterior"));
	BT_Nav[1]->signal_clicked ().connect(sigc::bind<int>(sigc::mem_fun(*this,&LCAIXA::navegar),2));
	BT_Nav[2] = new Gtk::ToolButton (Gtk::Stock::GO_FORWARD);
	BT_Nav[2]->set_tooltip_text (Glib::ustring("Próximo"));
	BT_Nav[2]->signal_clicked ().connect(sigc::bind<int>(sigc::mem_fun(*this,&LCAIXA::navegar),3));
	BT_Nav[3] = new Gtk::ToolButton (Gtk::Stock::GOTO_LAST);
	BT_Nav[3]->set_tooltip_text (Glib::ustring("Último"));
	BT_Nav[3]->signal_clicked ().connect(sigc::bind<int>(sigc::mem_fun(*this,&LCAIXA::navegar),4));
	Contagem = new Gtk::Label(Glib::ustring(" 0/0 "));
	BT_Item = new Gtk::ToolItem ();
	BT_Item->add(*Contagem);
	TB->append(*BT_Nav[0]);
	TB->append(*BT_Nav[1]);
	TB->append(*BT_Item);
	TB->append(*BT_Nav[2]);
	TB->append(*BT_Nav[3]);
	Box->pack_start(*TB,false,false,0);
	add(*Box);
	this->show_all();
	}

LCAIXA::~LCAIXA()
	{
	}

void LCAIXA::sair(Gtk::Window *w)
	{
	w->hide();
	}

void LCAIXA::carregar(int opc)
	{
	string AUX;
	char *sql;
	int regs, j, decimal;
	float real;
	vector<vector<string> > resultados;
	vector<vector<string> >::iterator i;
	vector<string> linha;
	switch(opc)
		{
		case 1:
			{
			arvore_ref = Gtk::ListStore::create(arvore_reg);
			TV->set_model(arvore_ref);
			AUX.clear();
			AUX = "select count(*) from livroauxiliar.lancamentos";
			sql = new char[AUX.length()+1];
			strcpy(sql,AUX.c_str());
			conexao->executar(sql);
			delete sql;
			if (conexao->query_result != 3)
				{
				regs = conexao->registros;
				if (regs > 0)
					{
					conexao->resultado();
					linha.clear();
					linha = conexao->resultados.at(0);
					total = atoi(linha.at(0).c_str());
					paginas = floor(total/limite);
					sql = new char[32];
					sprintf (sql," limit %d offset %d ",limite,(pagina*limite));
					AUX.clear();
					AUX = "select lancamentos.id,lancamentos.data,lancamentos.protocolo,atos.descricao,lancamentos.descricao,lancamentos.livro,lancamentos.folha,lancamentos.receita,lancamentos.despesa from livroauxiliar.lancamentos inner join livroauxiliar.atos on lancamentos.tipo_ato=atos.tipo_ato order by data desc";
					AUX.append(sql);
					delete sql;
					sql = new char[AUX.length()+1];
					strcpy(sql,AUX.c_str());
					//cout << sql << endl;
					conexao->executar(sql);
					delete sql;
					if (conexao->query_result != 3)
						{
						regs = conexao->registros;
						if (regs > 0)
							{
							conexao->resultado();
							resultados.clear();
							resultados = conexao->resultados;
							for (i=resultados.begin(); i < resultados.end();i++)
								{
								linha = *i;
								celula = *(arvore_ref->append());
								decimal = atoi(linha.at(0).c_str());
								celula[arvore_reg.codigo] = decimal;
								sql = new char[linha.at(1).length()+1];
								strcpy(sql,linha.at(1).c_str());
								celula[arvore_reg.campo[0]] = data_formatada(sql,2);
								delete sql;
								decimal = atoi(linha.at(2).c_str());
								celula[arvore_reg.protocolo] = decimal;
								celula[arvore_reg.campo[1]] = linha.at(3);
								celula[arvore_reg.campo[2]] = linha.at(4);
								celula[arvore_reg.campo[3]] = linha.at(5);
								celula[arvore_reg.campo[4]] = linha.at(6);
								real = atof(linha.at(7).c_str());
								celula[arvore_reg.receita] = real;
								real = atof(linha.at(8).c_str());
								celula[arvore_reg.despesa] = real;
								}
							}
						}
					}
				}
			else
				{
				cout << conexao->mensagem << endl;
				}
			TV->remove_all_columns();
			TV->append_column(Glib::ustring("Data"), arvore_reg.campo[0]);
			TV->append_column_numeric(Glib::ustring("Protocolo") , arvore_reg.protocolo, "%d");
			TV->append_column(Glib::ustring("Tipo"), arvore_reg.campo[1]);
			TV->append_column(Glib::ustring("Descrição"), arvore_reg.campo[2]);
			TV->append_column(Glib::ustring("Livro"), arvore_reg.campo[3]);
			TV->append_column(Glib::ustring("Folha"), arvore_reg.campo[4]);
			TV->append_column_numeric(Glib::ustring("Receita"), arvore_reg.receita, "%0.2f");
			TV->append_column_numeric(Glib::ustring("Despesa"), arvore_reg.despesa, "%0.2f");
			for(j=0; j < 7; j++)
				{
				Gtk::TreeView::Column* coluna_temp = TV->get_column(j);
				coluna_temp->set_reorderable();	
				}
			sql = new char[32];
			sprintf(sql," %d/%d ",pagina,paginas);
			AUX.clear();
			AUX.append(sql);
			delete sql;
			Contagem->set_text(Glib::ustring(AUX));
			break;
			}
		}
	}

void LCAIXA::navegar(int direcao)
	{
	switch(direcao)
		{
		case 1:
			{
			if (pagina != 0)
				{
				pagina = 0;
				}
			else
				{
				Gtk::MessageDialog dialog(*this, Glib::ustring("Navegação"), false, Gtk::MESSAGE_INFO);
				dialog.set_secondary_text(Glib::ustring("Você já se encontra na Primeira Página"));
				dialog.run();
				}
			break;
			}
		case 2:
			{
			if (pagina != 0)
				{
				pagina--;
				}
			else
				{
				Gtk::MessageDialog dialog(*this, Glib::ustring("Navegação"), false, Gtk::MESSAGE_INFO);
				dialog.set_secondary_text(Glib::ustring("Você já se encontra na Primeira Página"));
				dialog.run();
				}
			break;
			}
		case 3:
			{
			if (pagina != paginas)
				{
				pagina++;
				}
			else
				{
				Gtk::MessageDialog dialog(*this, Glib::ustring("Navegação"), false, Gtk::MESSAGE_INFO);
				dialog.set_secondary_text(Glib::ustring("Você já se encontra na Última Página"));
				dialog.run();
				}
			break;
			}
		case 4:
			{
			if (pagina != paginas)
				{
				pagina = paginas;
				}
			else
				{
				Gtk::MessageDialog dialog(*this, Glib::ustring("Navegação"), false, Gtk::MESSAGE_INFO);
				dialog.set_secondary_text(Glib::ustring("Você já se encontra na Última Página"));
				dialog.run();
				}
			break;
			}
		}
	carregar(1);
	}